package com.bt.lms.ui.page.sys.user;

import com.bt.lms.entity.Role;
import com.bt.lms.entity.page.Page;
import com.bt.lms.main.BotLmsApp;
import com.bt.lms.ui.page.sys.user.action.UARelationBtnAction;
import com.bt.lms.ui.page.sys.utils.MyButton;
import com.bt.lms.ui.page.sys.style.BoxStyle;
import com.bt.lms.ui.page.sys.style.BtnStyle;
import com.bt.lms.ui.page.sys.style.LabStyle;
import com.bt.lms.ui.page.sys.utils.MyHBox;
import com.bt.lms.ui.page.sys.utils.MyVBox;
import com.bt.lms.ui.page.sys.user.action.UASaveBtnAction;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;

import java.util.ArrayList;
import java.util.List;

/**
 * 添加用户界面
 *
 * @author 徐大永
 */
public class PageAdd extends VBox {

    /**
     * 邮箱输入框id
     */
    public final static String EMAIL_TF = "emailTF";

    /**
     * 邮箱提示id
     */
    public final static String EMAIL_HINT_LAB = "emailMustLab";

    /**
     * 姓名输入框id
     * nameMustLab
     */
    public final static String NAME_TF = "nameTF";

    /**
     * 姓名提示id
     */
    public final static String NAME_HINT_LAB = "nameHintLab";

    /**
     * 证件类型id
     */
    public final static String ID_TYPE_CB = "idTypeCB";

    /**
     * 证件号码id
     */
    public final static String ID_TF = "idTF";

    /**
     * 证件号提示id
     */
    private static final String ID_HINT_LAB = "idHintLab";

    /**
     * 所属单位id
     */
    public final static String UNIT_TF = "unitTF";

    /**
     * 所属单位提示id
     */
    public final static String UNIT_HINT_LAB = "unitHintTF";

    /**
     * 移动电话id
     */
    public final static String PHONE_TF = "phoneTF";

    /**
     * 移动电话提示id
     */
    public final static String PHONE_HINT_LAB = "phoneHintTF";

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 关联角色
     */
    private List<Role> roles;

    /**
     * 构造界面
     */
    public PageAdd(PageSkipInfo pageSkipInfo) {

        //维护
        this.pageSkipInfo = pageSkipInfo;

        //大小，布局
        int wight = BotLmsApp.PER_WIGHT;
        int height = BotLmsApp.HEIGHT;
        this.setPrefWidth(wight);
        this.setPrefHeight(height);

        //组件
        //定位区域
        MyHBox locationHBox = new MyHBox();
        locationHBoxInit(locationHBox);

        //输入区域
        VBox vBox = new VBox();
        ScrollPane scrollPane = new ScrollPane();
        //取消横向滚动条的显示
        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);
        scrollPane.setContent(vBox);

        //输入区域
        MyVBox inputVBox = new MyVBox();
        vBox.getChildren().add(inputVBox);
        inputVBoxInit(inputVBox);

        //控制区域
        MyHBox controlHBox = new MyHBox();
        vBox.getChildren().add(controlHBox);
        controlHBoxInit(controlHBox);

        //添加组件
        ObservableList<Node> children = this.getChildren();
        children.addAll(locationHBox, scrollPane);

    }

    /**
     * 输入区域初始化
     *
     * @param inputVBox 输入区域
     */
    private void inputVBoxInit(MyVBox inputVBox) {


        //布局
        Insets insets = new Insets(12);
        inputVBox.setPadding(insets);
        inputVBox.setSpacing(8);
        inputVBox.setAlignment(Pos.CENTER_LEFT);

        //组件（位置）
        Label locationLab = new Label("新增后台用户");
        HBox locationHBox = new HBox(locationLab);
        //布局
        locationHBox.setPadding(new Insets(5));
        //组件添加
        ObservableList<Node> locationChildren = inputVBox.getChildren();
        locationChildren.add(locationHBox);
        LabStyle.locationSize(locationLab);
        //标签样式（盒子）
        BoxStyle.labelStyle(locationHBox);
        //组件（说明）
        Label explainLab = new Label("基本信息");
        //组件添加
        ObservableList<Node> explainChildren = inputVBox.getChildren();
        explainChildren.add(explainLab);
        //样式(提示标签)
        LabStyle.hintLab(explainLab);
        //组件（输入网格
        GridPane gridPane = inputGrid();
        inputVBox.getChildren().add(gridPane);

        //组件（关联角色）
        VBox relaVBox = new VBox();
        inputVBox.getChildren().add(relaVBox);
        relaVBoxInit(relaVBox);

    }

    /**
     * 定位区域初始化
     *
     * @param locationHBox 定位区域容器
     */
    private void locationHBoxInit(MyHBox locationHBox) {

        //控制数据
        int height = 42;

        //大小
        locationHBox.setPrefHeight(height);

        //布局
        Insets insets = new Insets(5);
        locationHBox.setPadding(insets);
        locationHBox.setSpacing(0);
        locationHBox.setAlignment(Pos.CENTER_LEFT);

        //组件
        Label siteLab = new Label("当前位置：");
        locationHBox.getChildren().add(siteLab);
        LabStyle.notWeight(siteLab);//不重要（颜色浅）
        LabStyle.locationSize(siteLab);//位置样式

        Label label = new Label("🏠");
        locationHBox.getChildren().add(label);
        LabStyle.notWeight(label, 0.3);
        LabStyle.locationSize(label);

        Label oneCatalogLab = new Label(">系统管理");
        locationHBox.getChildren().add(oneCatalogLab);
        LabStyle.notWeight(oneCatalogLab);//不重要（颜色浅）
        LabStyle.locationSize(oneCatalogLab);//位置样式
        LabStyle.interaction(oneCatalogLab);

        Label twoCatalogLab = new Label(">后台用户管理");
        locationHBox.getChildren().add(twoCatalogLab);
        LabStyle.notWeight(twoCatalogLab);//不重要（颜色浅）
        LabStyle.locationSize(twoCatalogLab);//位置样式
        LabStyle.interaction(twoCatalogLab);

        Label threeCatalogLab = new Label(">新增后台用户");
        locationHBox.getChildren().add(threeCatalogLab);
        LabStyle.notWeight(threeCatalogLab);//不重要（颜色浅）
        LabStyle.locationSize(threeCatalogLab);//位置样式


    }


    /**
     * 控制区域初始化
     *
     * @param controlHBox 控制区域
     */
    private void controlHBoxInit(MyHBox controlHBox) {

        //布局
        Insets insets = new Insets(10);
        controlHBox.setPadding(insets);
        controlHBox.setSpacing(10);
        controlHBox.setAlignment(Pos.CENTER);

        //组件(保存)
        MyButton saveBtn = new MyButton("保存");
        //大小控制
        Insets saveBtnInsets = new Insets(5, 12, 5, 12);
        saveBtn.setPadding(saveBtnInsets);
        //组件添加
        ObservableList<Node> saveBtnChildren = controlHBox.getChildren();
        saveBtnChildren.add(saveBtn);
        //事件
        EventHandler<ActionEvent> saveBtnAction = new UASaveBtnAction(pageSkipInfo,roles);
        saveBtn.setOnAction(saveBtnAction);
        //样式
        BtnStyle.saveBtn(saveBtn);
        BtnStyle.saveBtnAction(saveBtn);

        //组件(取消)
        MyButton cancelBtn = new MyButton("取消");
        //大小控制
        Insets cancelBtnInsets = new Insets(5, 12, 5, 12);
        cancelBtn.setPadding(cancelBtnInsets);
        //事件
        cancelBtn.setOnAction(event -> NetWorkUtils.reqUserPagingPage(pageSkipInfo, new Page<>()));
        //组件添加
        ObservableList<Node> cancelBtnChildren = controlHBox.getChildren();
        cancelBtnChildren.add(cancelBtn);
        //样式
        BtnStyle.cancelBtn(cancelBtn);
        BtnStyle.cancelBtnAction(cancelBtn);

    }

    /**
     * 网格布局
     *
     * @return 网格布局
     */
    private GridPane inputGrid() {

        //新建网格布局
        GridPane res = new GridPane();

        //大小
        res.setPrefWidth(1280);
        res.setPadding(new Insets(5));
        res.setHgap(15);//间隙（左右）
        res.setVgap(15);//间隙（上下）

        //账号部分 eMail
        eMailInit(res);

        //用户姓名部分 name
        nameLabInit(res);

        //证件类型部分 idType
        idTypeInit(res);

        //证件号码部分 id
        idInit(res);

        //所属单位部分 unit
        unitInit(res);

        //移动电话部分 phone
        phoneInit(res);

        return res;
    }

    /**
     * 网格的账号区域初始化
     *
     * @param res 网格
     */
    private void eMailInit(GridPane res) {

        //文本说明
        Label emailLab = new Label("账号(电子邮箱或手机号)");
        res.add(emailLab, 0, 1);
        GridPane.setHalignment(emailLab, HPos.RIGHT);

        //输入框
        TextField emailTF = new TextField();
        emailTF.setId(EMAIL_TF);
        emailTF.setPromptText("邮箱");
        res.add(emailTF, 1, 1);

        //提示
        Label emailHintLab = new Label("*");
        emailHintLab.setId(EMAIL_HINT_LAB);
        emailHintLab.setTextFill(Color.RED);
        res.add(emailHintLab, 2, 1);


    }

    /**
     * 网格的姓名区域初始化
     *
     * @param res 网格
     */
    private void nameLabInit(GridPane res) {

        Label nameLab = new Label("用户姓名");
        res.add(nameLab, 0, 3);
        GridPane.setHalignment(nameLab, HPos.RIGHT);

        TextField nameTF = new TextField();
        nameTF.setPromptText("真实姓名。");
        nameTF.setId(NAME_TF);
        res.add(nameTF, 1, 3);


        Label nameHintLab = new Label("*");
        nameHintLab.setId(NAME_HINT_LAB);
        nameHintLab.setTextFill(Color.RED);
        res.add(nameHintLab, 2, 3);
    }

    /**
     * 网格的证件类型初始化
     *
     * @param res 网格
     */
    private void idTypeInit(GridPane res) {

        Label idTypeLab = new Label("证件类型");
        res.add(idTypeLab, 0, 4);

        //下拉框
        ChoiceBox<String> idTypeCB = new ChoiceBox<>();
        //所有可选项
        idTypeCB.getItems().addAll("身份证", "士官证", "学生证", "驾驶证", "护照", "港澳通行证");
        //默认显示
        idTypeCB.setValue("身份证");
        //剩余问题：展开的显示位置
        idTypeCB.setId(ID_TYPE_CB);
        res.add(idTypeCB, 1, 4);
        GridPane.setHalignment(idTypeLab, HPos.RIGHT);
    }

    /**
     * 网格的证件号区域初始化
     *
     * @param res 网格
     */
    private void idInit(GridPane res) {

        Label idLab = new Label("证件号码");
        res.add(idLab, 0, 5);
        GridPane.setHalignment(idLab, HPos.RIGHT);

        TextField idTF = new TextField();
        idTF.setId(ID_TF);
        idTFHintInit(idTF);
        res.add(idTF, 1, 5);

        Label idHintLab = new Label("*");
        idHintLab.setId(ID_HINT_LAB);
        idHintLab.setTextFill(Color.RED);
        res.add(idHintLab, 2, 5);
    }

    /**
     * 证件号码提示文本
     *
     * @param idTF 证件号码文本框
     */
    private void idTFHintInit(TextField idTF) {
        idTF.setPromptText("请输入证件号码");
    }

    /**
     * 网格的所属单位区域初始化
     *
     * @param res 网格
     */
    private void unitInit(GridPane res) {

        Label unitLab = new Label("所属单位");
        res.add(unitLab, 0, 6);
        GridPane.setHalignment(unitLab, HPos.RIGHT);

        TextField unitTF = new TextField();
        unitTF.setId(UNIT_TF);
        unitTF.setPromptText("单位全名");
        res.add(unitTF, 1, 6);

        Label unitHintLab = new Label("*");
        unitHintLab.setId(UNIT_HINT_LAB);
        unitHintLab.setTextFill(Color.RED);
        res.add(unitHintLab, 2, 6);

    }

    /**
     * 网格的移动电话区域初始化
     *
     * @param res 网格
     */
    private void phoneInit(GridPane res) {

        Label phoneLab = new Label("移动电话");
        res.add(phoneLab, 0, 2);
        GridPane.setHalignment(phoneLab, HPos.RIGHT);


        TextField phoneTF = new TextField();
        phoneTF.setId(PHONE_TF);
        phoneTF.setPromptText("11位电话");
        res.add(phoneTF, 1, 2);

        Label phoneHintLab = new Label("*");
        phoneHintLab.setId(PHONE_HINT_LAB);
        phoneHintLab.setTextFill(Color.RED);
        res.add(phoneHintLab, 2, 2);
    }

    /**
     * 关联角色区域初始化
     *
     * @param relaVBox 关联角色区域
     */
    private void relaVBoxInit(VBox relaVBox) {

        //布局
        relaVBox.setSpacing(15);

        //说明文本
        Label relationLab = new Label("设置用户与角色关联");
        relaVBox.getChildren().add(relationLab);

        //触发按钮
        Button relationBtn = new Button("关联角色");
        relaVBox.getChildren().add(relationBtn);


        //展示列表 容器
        VBox roleTableViewVBox = new VBox();
        //添加进关系角色区域中
        relaVBox.getChildren().add(roleTableViewVBox);

        //角色合集
        roles = new ArrayList<>();
        //初始化一个内容
        RoleTableView roleTableView = new RoleTableView(roles);
        roleTableViewVBox.getChildren().add(roleTableView);


        //触发按钮事件
        UARelationBtnAction uaRelationBtnAction = new UARelationBtnAction(roles, roleTableViewVBox);
        relationBtn.setOnAction(uaRelationBtnAction);

    }

}

